/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.actions.dispositivos;

import com.mapping.Componentes;
import com.mapping.Departamento;
import com.mapping.Dispositivo;
import com.mapping.Modelo;
import com.mapping.TipoDisp;
import com.opensymphony.xwork2.ActionSupport;
import static com.opensymphony.xwork2.Action.SUCCESS;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
/**
 *
 * @author Andres
 */
@Namespace(value = "/")
@Action(value = "altaDispositivo", results = {@Result(name = "success", location = "/GestionDispositivos/rAltaDispositivo.jsp"),
                                              @Result(name = "error",location="/GestionDispositivos/eAltaDispositivo.jsp")})
public class AltaDispositivoAction extends ActionSupport{
    private String noserie;
    private String departamento;
    private String nombreDepa;
    private String localizacion;
    private String estado;
    private String modelo;
    private String error;
    private String id;
    private List<String> idComponente;
    private List<String> caractComp;
    private String cantidad;
    @Override
    public String execute(){
        boolean is=true;
        String consulta = "select max(d.idDisp) from Dispositivo d where d.idDisp like :idDisp";
        String consultaE = "select idDisp from dispositivo d INNER JOIN modelo m on (d.idModelo=m.idModelo) where m.idModelo=?1 and d.noserie=?2 limit 1";
        Query query;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("inventarios");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        Modelo m = (Modelo)em.getReference(Modelo.class, Integer.parseInt(modelo));
        String tipoId = m.getIdTipo().getTipo().substring(0,2).toUpperCase();    
        tipoId = tipoId +  m.getIdMarca().getMarca().substring(0,2).toUpperCase();
        tipoId = tipoId + m.getModelo().substring(0,3).toUpperCase();
        query = em.createQuery(consulta);
        query.setParameter("idDisp", tipoId + "%");
        Departamento depa = (Departamento) em.createNamedQuery("Departamento.findByIdDepartamento").setParameter("idDepartamento", departamento).getSingleResult();
        nombreDepa = depa.getNombre();
        List<Departamento> depaList = new ArrayList<Departamento>();
        depaList.add(depa); 
        Dispositivo disp;
        for(int nd=0, numero=Integer.parseInt(cantidad); nd < numero;nd++){
            disp = new Dispositivo();
            id = formateId((String) query.getSingleResult(), tipoId, 3);
            disp.setIdDisp(id);    
            disp.setIdModelo(m);
            disp.setNoserie(noserie);
            disp.setLocalizacion(localizacion);
            disp.setEstado(estado);   
            disp.setDepartamentoCollection(depaList);
            if(idComponente!=null){
                for(int i=0;i < idComponente.size();i++ ){
                    Componentes comp = new Componentes();
                    comp.setIdDispActual(disp);
                    comp.setIdDispOrigen(disp);
                    comp.setIdTipo((TipoDisp) em.getReference(TipoDisp.class, Integer.parseInt(idComponente.get(i))));
                    comp.setCaracteristicas(caractComp.get(i));
                    comp.setStatus("Nuevo");
                    em.persist(comp);
                }
            }    
            em.persist(disp);
            em.flush();
        }
        tx.commit();
        em.close();
        
        return SUCCESS;
    }

    public void setNoserie(String noserie) {
        this.noserie = noserie;
    }

    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }

    public void setLocalizacion(String localizacion) {
        this.localizacion = localizacion;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public void setModelo(String modelo) {
        this.modelo = modelo;
    }
    
    public String getNoserie() {
        return noserie;
    }

    public String getNombreDepa() {
        return nombreDepa;
    }

    public String getLocalizacion() {
        return localizacion;
    }

    public String getId() {
        return id;
    }

    public String getError() {
        return error;
    }

    public void setCantidad(String cantidad) {
        this.cantidad = cantidad;
    }
    
    

    public void setIdComponente(List<String> idComponente) {
        this.idComponente = idComponente;
    }

    public void setCaractComp(List<String> caractComp) {
        this.caractComp = caractComp;
    }
    
    
    public String formateId(String id, String tipoId, int length) {
        String numero;
        if (id == null) {
            id = tipoId + "001";
        } else {
            id = id.substring(7,10);
            numero = "" + (Integer.parseInt(id) + 1);
            id = tipoId;
            for (int i = numero.length(); i < length; i++) {
                id += "0";
            }
            id += numero;
        }
        return id;
    }
    
}